ako ziskat hwnd okna z hooku ?

Otázka od: Robert Suska

26. 11. 2003 14:46

Ahojte

Lamem to uz tri hodiny   a uz nemam silu....

Mam nadefinovanu metodu

function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
Cardinal): longint; stdcall;
begin
  result := 0;
  if Code = HCBT_SYSCOMMAND then
  begin
    if wParam = SC_MINIMIZE then
    begin
      Application.Minimize;
      // sem chcem ten kod
    end;
    if wParam = SC_RESTORE then
    begin
      Application.Restore;
    end;
  end;
  if (Code < 0) then
    result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
end;

a hook inicializujem takto

HookHandleCbt := SetWindowsHookEx(WH_CBT, @TheHookProcCbt, hInstance,
GetCurrentThreadId);

jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale otvorene a z
neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
minimalizacii hocijakeho modalneho formu minimalizovala cela aplikacia. Toto
uz funguje tym co som sem pastol ale ten najvrchnejsi modalny form sa mi
hodi nad Start tlacitko (ako ked v delphi minimalizujete v design time
nejaky form alebo source code)   windows menu a preto potrebujem zistit
handle toho okna z ktoreho bol vyslany povel na minimalizaciu (vlastne
handle najvrchnejsieho formu) aby som mohol povedat tomu oknu aby sa
schovalo... dufam ze by to slo cez ShowWindowAsync() ?? Handle som sa
pokusil dostat cez hwnd := tagMSG(Ptr(lParam)^).hwnd; ale toto sa da pouzit
iba s hookom WH_GETMESSAGE inac to hadze exception a potom som skusal este
cez msg := TMsg(Ptr(lParam)^); hwnd := msg.hwnd a toto tiez nejde  

Dik za nakopnutie

Robo






----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Bronislav Klucka

26. 11. 2003 14:50

API funkce hwnd:=GetForegroundWindow; (pokud ne ona, najdi si odkazy na
msdn, ktere jsou u teto fce)


Brona

> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Robert Suska
> Sent: Wednesday, November 26, 2003 2:21 PM
> To: delphi-l@clexpert.cz
> Subject: ako ziskat hwnd okna z hooku ?
>
>
> Ahojte
>
> Lamem to uz tri hodiny   a uz nemam silu....
>
> Mam nadefinovanu metodu
>
> function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
> Cardinal): longint; stdcall;
> begin
> result := 0;
> if Code = HCBT_SYSCOMMAND then
> begin
> if wParam = SC_MINIMIZE then
> begin
> Application.Minimize;
> // sem chcem ten kod
> end;
> if wParam = SC_RESTORE then
> begin
> Application.Restore;
> end;
> end;
> if (Code < 0) then
> result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
> end;
>
> a hook inicializujem takto
>
> HookHandleCbt := SetWindowsHookEx(WH_CBT, @TheHookProcCbt, hInstance,
> GetCurrentThreadId);
>
> jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale
> otvorene a z
> neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
> minimalizacii hocijakeho modalneho formu minimalizovala cela
> aplikacia. Toto
> uz funguje tym co som sem pastol ale ten najvrchnejsi modalny form sa mi
> hodi nad Start tlacitko (ako ked v delphi minimalizujete v design time
> nejaky form alebo source code)   windows menu a preto potrebujem zistit
> handle toho okna z ktoreho bol vyslany povel na minimalizaciu (vlastne
> handle najvrchnejsieho formu) aby som mohol povedat tomu oknu aby sa
> schovalo... dufam ze by to slo cez ShowWindowAsync() ?? Handle som sa
> pokusil dostat cez hwnd := tagMSG(Ptr(lParam)^).hwnd; ale toto sa
> da pouzit
> iba s hookom WH_GETMESSAGE inac to hadze exception a potom som skusal este
> cez msg := TMsg(Ptr(lParam)^); hwnd := msg.hwnd a toto tiez nejde  
>
> Dik za nakopnutie
>
> Robo
>
>
>
>





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Vones

26. 11. 2003 15:13

From: "Robert Suska" <suskar@seznam.cz>
> jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale otvorene a z
> neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
> minimalizacii hocijakeho modalneho formu minimalizovala cela aplikacia. Toto

Nejdes na to s hook funkci zbytecne slozite ? Co si napriklad tuto funkci
doplnit do predka tech modalnich dialogu (odchycenim WM_SYSMCOMMAND zpravy a
prislusnym zpracovanim).

Petr Vones





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Robert Suska

26. 11. 2003 15:23

Ahoj

Idem na to trochu zlozito ale za jednym ucelom, lebo sa mi nechce pisat do
kazdeho formu tento kod

Tform.....

private
procedure one(var XMEssage: TMessage); message WM_SYSCOMMAND;
end;

procedure TfrmNisHosp.one;
begin
  if XMessage.WParam = SC_MINIMIZE then
  begin
   Application.Minimize;
   ShowWindowAsync(self.handle, SW_HIDE);
  end;
  inherited
end;

takze mi to vsetko urobi ten hook cize zo vsetkych formov mi to bude
odchytavat minimize a restore a bude to robit co chcem  

inac uz to skoro mam nieco ma este napadlo, takze to sem pastnem ked to bude
odladene mozno sa to niekomu zide  

Robo

> Nejdes na to s hook funkci zbytecne slozite ? Co si napriklad tuto funkci
> doplnit do predka tech modalnich dialogu (odchycenim WM_SYSMCOMMAND zpravy
a
> prislusnym zpracovanim).
>
> Petr Vones





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Vones

26. 11. 2003 15:20

From: "Robert Suska" <suskar@seznam.cz>
> Idem na to trochu zlozito ale za jednym ucelom, lebo sa mi nechce pisat do
> kazdeho formu tento kod

Proto jsem psal, at si vytvoris takovy formular jako predka a od neho pak
odvozujes svoje dialogy.

Pouziti hooku ma negativni vliv na rychlost zpracovani zprav.

Petr Vones





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Robert Suska

26. 11. 2003 18:31

Ahojte

takze takto som to urobil

function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
Cardinal): longint; stdcall;
begin
  result := 0;
  case Code of
    HCBT_SYSCOMMAND:
                    case wParam of
                      SC_MINIMIZE:
                                  begin
                                    if GetForegroundWindow <>
Application.Handle then
                                      ShowWindowAsync(GetForegroundWindow,
SW_HIDE)
                                    else
                                      ShowWindowAsync(frmMain.Handle,
SW_HIDE);
                                    SendMessage(Application.Handle,
WM_SYSCOMMAND, SC_MINIMIZE, 0);
                                  end;
                      SC_RESTORE:
                                  begin
                                    SendMessage(Application.Handle,
WM_SYSCOMMAND, SC_RESTORE, 0);
                                    if GetForegroundWindow <>
Application.Handle then
                                      ShowWindowAsync(frmNisHosp.Handle,
SW_SHOW);
                                  end;
                    end;
  end;
  if (Code < 0) then
    result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
end;

toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem
toto je super len to musim rozbehat na w98 a pohoda. Chyba vznikla na adrese
015f:004492ed.  

Robo





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Vones

26. 11. 2003 19:07

From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim

Za prve nevim proc pouzivas zrovna CBT hook, pro filtrovani zprav jsou jine.

> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem

Pak je treba najit proc. Neni duvod proc by to nemelo fungovat.

> toto je super len to musim rozbehat na w98 a pohoda. Chyba vznikla na adrese

Tenhle kod ma jednu vadu, ovlivnuje chod vseho v aplikaci. Takze nejsi schopen
jej nikdy odladit, protoze jakakoli zmena v aplikaci muze navodit situaci, ze
se tam objevi opet nova chyba kterou si predtim nepodchytil. Zkratka se to k
tomu nehodi. Je to trochu jak s kanonem na vrabce.

> 015f:004492ed.  

Podle formatu adresy to bude nekde v 16ti bitove casti kernelu. Windows 9x z
casti stale pouzivaji 16bitovy kod pro nektere operace, napriklad prace s
ikonami apod.

Moje rada je to takto zkratka neresit.

Petr Vones





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Vones

26. 11. 2003 20:43

From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem

Pokud jsem to dobre pochopil tak chces neco takoveho:

{ TAbstractDialog }

procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand);
begin
  case Message.CmdType and $FFF0 of
    SC_MINIMIZE:
      Application.Minimize;
  else
    inherited;
  end;
end;

Petr Vones




----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Petr Vones

26. 11. 2003 20:21

From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem

Pokud jsem to dobre pochopil tak chces neco takoveho:

procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand);
begin
  case Message.CmdType and $FFF0 of
    SC_MINIMIZE:
      begin
        Application.Minimize;
        Message.Result := 0;
      end;
  else
    inherited;
  end;
end;

Petr Vones




----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)

Odpovedá: Robert Suska

27. 11. 2003 0:47

Ahoj

> Pokud jsem to dobre pochopil tak chces neco takoveho:

>procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand); begin
> case Message.CmdType and $FFF0 of
> SC_MINIMIZE:
> Application.Minimize;
> else
> inherited;
> end;
>end;

>Petr Vones

Ake easy   presne toto som chcel a ja idem s tankom na zajace  

Dik moc, funguje to skvele

Robo





----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)